home *** CD-ROM | disk | FTP | other *** search
- 10 ! *********************************************************************
- 20 ! Example: Alarm Clock
- 30 !
- 40 ! This program builds a digital alarm clock. You can set an alarm
- 50 ! time using a SCROLLBAR. A TOGGLEBUTTON allows you to disable
- 60 ! or enable alarm operation. A PUSHBUTTON allows you to turn off
- 70 ! the alarm.
- 80 !
- 90 ! *********************************************************************
- 100 !
- 110 CLEAR SCREEN
- 120 OPTION BASE 1
- 130 !
- 140 INTEGER Alarmval,Hour,Minute,N,Noisy
- 150 Noisy=0
- 160 !
- 170 DIM A$[8],T$[8]
- 180 !
- 190 INTEGER Black,White,Red,Yellow,Green,Cyan,Blue,Magenta
- 200 !
- 210 Black=0
- 220 White=1
- 230 Red=2
- 240 Yellow=3
- 250 Green=4
- 260 Cyan=5
- 270 Blue=6
- 280 Magenta=7
- 290 !
- 300 INTEGER A(6),Nlines
- 310 REAL Dw,Dh,Vh,Pw,Ph,Px,Py
- 320 !
- 330 GESCAPE CRT,3;A(*)! Get display bounds
- 340 Dw=A(3)-A(1)+1 ! Compute display width in pixels
- 350 Dh=A(4)-A(2)+1 ! Compute display height in pixels
- 360 STATUS CRT,13;Nlines! Get number of text lines on display
- 370 Vh=Dh*(1-6/Nlines)! Height above DISP line
- 380 !
- 390 Pw=320 ! PANEL width is half display width
- 400 Ph=240 ! Same for PANEL height
- 410 Px=(Dw-Pw)/2 ! Center panel horizontally
- 420 Py=(Vh-Ph)/2 ! Center panel above DISP line
- 430 !
- 440 ! Build the main PANEL
- 450 !
- 460 ASSIGN @Main TO WIDGET "PANEL";SET ("VISIBLE":0)
- 470 CONTROL @Main;SET ("X":Px,"Y":Py,"WIDTH":1.2*Pw,"HEIGHT":Ph)
- 480 CONTROL @Main;SET ("TITLE":" Example: Alarm Clock")
- 490 CONTROL @Main;SET ("MAXIMIZABLE":0,"RESIZABLE":0)
- 500 CONTROL @Main;SET ("BACKGROUND":Blue)
- 510 CONTROL @Main;SET ("SYSTEM MENU":"Quit")
- 520 ON EVENT @Main,"SYSTEM MENU" GOTO Finis
- 530 !
- 540 ! Dimensions and coordinates for child widgets
- 550 !
- 560 REAL Ih,Iw ! Inside height and width
- 570 REAL Gw,Gh,Lw,Bw,Lh,Sw,Sh,Bgap! Child widget dimensions
- 580 REAL Y1,Y2,Y3,Y4,X1,X2 ! Child widget coordinates
- 590 !
- 600 STATUS @Main;RETURN ("INSIDE WIDTH":Iw,"INSIDE HEIGHT":Ih)
- 610 !
- 620 Gh=Ih*.05! Arbitrary height of vertical gap
- 630 Gw=Iw*.02! Arbitrary width of horizontal gap
- 640 Wh=Ih*.3! Arbitrary height of LABEL & BUTTON widgets
- 650 Lw=Iw*.6! Arbitrary width of LABEL widgets
- 660 !
- 670 X1=Gw ! Right side of LABELs & SCROLLBAR
- 680 X2=X1+Lw+Gw! Right side of BUTTONs
- 690 Bw=Iw-(X2+Gw)! BUTTON width
- 700 Sw=Iw-2*Gw! SCROLLBAR width
- 710 !
- 720 Y1=Gh ! Position of first row of widgets
- 730 Y2=Y1+Wh+Gh! Position of second row of widgets
- 740 Y3=Y2+Wh! Position of bottom of second row of widgets
- 750 Bgap=Ih-Y3! Height of bottom gap on PANEL
- 760 !
- 770 ! Create LABEL for time value
- 780 !
- 790 ASSIGN @Clock TO WIDGET "LABEL";PARENT @Main
- 800 CONTROL @Clock;SET ("X":X1,"Y":Y1,"WIDTH":Lw,"HEIGHT":Wh)
- 810 CONTROL @Clock;SET ("FONT":"18 BY 30,BOLD")
- 820 CONTROL @Clock;SET ("BACKGROUND":Black,"PEN":Red,"BORDER":0)
- 830 !
- 840 ! Create TOGGLEBUTTON to enable/disable alarm
- 850 !
- 860 ASSIGN @Toggle TO WIDGET "TOGGLEBUTTON";PARENT @Main
- 870 CONTROL @Toggle;SET ("X":X2,"Y":Y1,"WIDTH":Bw,"HEIGHT":Wh)
- 880 CONTROL @Toggle;SET ("FONT":"18 BY 16,BOLD","LABEL":" ENABLE ALARM")
- 890 !
- 900 ! Create LABEL for alarm value
- 910 !
- 920 ASSIGN @Alarm TO WIDGET "LABEL";PARENT @Main
- 930 CONTROL @Alarm;SET ("X":X1,"Y":Y2,"WIDTH":Lw,"HEIGHT":Wh)
- 940 !
- 950 ! Create PUSHBUTTON to stop alarm
- 960 !
- 970 ASSIGN @Stop TO WIDGET "PUSHBUTTON";PARENT @Main
- 980 CONTROL @Stop;SET ("X":X2,"Y":Y2,"WIDTH":Bw,"HEIGHT":Wh)
- 990 CONTROL @Stop;SET ("FONT":"18 BY 16,BOLD","LABEL":" STOP ALARM")
- 1000 CONTROL @Stop;SET ("LABEL":"STOP ALARM")
- 1010 !
- 1020 ! Create SCROLLBAR, then center
- 1030 !
- 1040 ASSIGN @Scroll TO WIDGET "SCROLLBAR";PARENT @Main
- 1050 CONTROL @Scroll;SET ("ORIENTATION":"HORIZONTAL")
- 1060 STATUS @Scroll;RETURN ("HEIGHT":Sh)
- 1070 Y4=Y3+(Bgap-Sh)/2
- 1080 CONTROL @Scroll;SET ("X":X1,"Y":Y4,"WIDTH":Sw)
- 1090 !
- 1100 ! Set scale on SCROLLBAR to run through minutes of day.
- 1110 ! Allow slider to be incremented by hour and minute values.
- 1120 !
- 1130 CONTROL @Scroll;SET ("MINIMUM":0,"MAXIMUM":1439)
- 1140 CONTROL @Scroll;SET ("MINOR INCREMENT":1,"MAJOR INCREMENT":60)
- 1150 !
- 1160 ! Set initial time and alarm
- 1170 !
- 1180 GOSUB Update
- 1190 GOSUB Newalarm
- 1200 !
- 1210 ! Make application visible
- 1220 !
- 1230 CLEAR SCREEN
- 1240 CONTROL @Main;SET ("VISIBLE":1)
- 1250 !
- 1260 ! Enable widget event
- 1270 !
- 1280 ON EVENT @Scroll,"CHANGED" GOSUB Newalarm
- 1290 ON CYCLE 1 GOSUB Update
- 1300 !
- 1310 ! Loop until the user presses a key, then exit
- 1320 !
- 1330 LOOP
- 1340 WAIT FOR EVENT
- 1350 END LOOP
- 1360 !
- 1370 ! ***************** End of Main Program **************************
- 1380 !
- 1390 ! This routine updates the clock time. If the alarm is on,
- 1400 ! (Noisy=1), it will beep.
- 1410 !
- 1420 ! Once it updates the time, it checks the time for a match against the
- 1430 ! alarm. If there is a match, it sets Noisy to cause an alarm, causes
- 1440 ! a beep, enables an event on the PUSHBUTTON to turn off the alarm,
- 1450 ! and turns the PUSHBUTTON red.
- 1460 !
- 1470 Update:!
- 1480 IF Noisy=1 THEN BEEP 3000,.15
- 1490 T$=TIME$(TIMEDATE)
- 1500 CONTROL @Clock;SET ("VALUE":T$)
- 1510 !
- 1520 STATUS @Toggle;RETURN ("VALUE":N)! Is alarm enabled?
- 1530 IF N=1 THEN ! Yes --
- 1540 IF A$=T$ THEN ! Compare time
- 1550 Noisy=1
- 1560 BEEP 3000,.15
- 1570 ON EVENT @Stop,"ACTIVATED" GOSUB Killnoise
- 1580 CONTROL @Stop;SET ("BACKGROUND":Red)
- 1590 END IF
- 1600 END IF
- 1610 RETURN
- 1620 !
- 1630 ! This routine turns off the alarm
- 1640 !
- 1650 Killnoise:!
- 1660 OFF EVENT @Stop,"ACTIVATED"
- 1670 CONTROL @Stop;SET ("BACKGROUND":Blue)
- 1680 Noisy=0
- 1690 RETURN
- 1700 !
- 1710 ! This routine updates the alarm value. The value provided by
- 1720 ! the SCROLLBAR is converted into a time strng that matches
- 1730 ! that provided by TIME$(TIMEDATE).
- 1740 !
- 1750 Newalarm:!
- 1760 STATUS @Scroll;RETURN ("VALUE":Alarmval)
- 1770 !
- 1780 Hour=Alarmval DIV 60
- 1790 SELECT Hour
- 1800 CASE 0
- 1810 A$="12"
- 1820 CASE 1 TO 9
- 1830 A$="0"&VAL$(Hour)
- 1840 CASE ELSE
- 1850 A$=VAL$(Hour)
- 1860 END SELECT
- 1870 A$=A$&":"
- 1880 !
- 1890 Minute=Alarmval MOD 60
- 1900 SELECT Minute
- 1910 CASE 0 TO 9
- 1920 A$=A$&"0"&VAL$(Minute)
- 1930 CASE ELSE
- 1940 A$=A$&VAL$(Minute)
- 1950 END SELECT
- 1960 A$=A$&":00"
- 1970 !
- 1980 CONTROL @Alarm;SET ("VALUE":A$)
- 1990 RETURN
- 2000 !
- 2010 Finis:!
- 2020 ASSIGN @Main TO *! Delete PANEL widget
- 2030 CLEAR SCREEN
- 2040 END
-